/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Almacenamiento;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Thony
 */
public class Catalogo {
    /** nombre de archivo del catalogo*/
    private String archivoCatalogo;
    /** entradas del catalogo,mapean nombres de tabla a entradas*/
    private java.util.Map<String,EntradaCatalogo> entradas;
    /**numero de tablas que actualmente estan almacenados en el catalogo*/
    private int numeroDeTablas;

    public Catalogo(String ArchivoCatalogo){
        this.archivoCatalogo=ArchivoCatalogo;
        entradas=new java.util.Hashtable<String,EntradaCatalogo>();
    }
    /**
     *
     * @param entrada a crear
     * @throws IllegalArgumentException
     */
    public void CrearNuevaEntrada(EntradaCatalogo entrada) throws IllegalArgumentException{
        if(!existeTabla(entrada.getNombreTabla())){
            entradas.put(entrada.getNombreTabla(), entrada);//ingresamos la entrada con la clave nombre d tabla
            numeroDeTablas++;
        }else{
            throw  new IllegalArgumentException("Tabla: "+entrada.getNombreTabla()+" ya existe.");
        }
    }
    /**
     *
     * @param Entrada entrada a eliminar
     */
    public void EliminarEntrada(EntradaCatalogo Entrada){
        //verificamos si existe el nombre d la tabla para luego eliminarla de las entradas
        if (existeTabla(Entrada.getNombreTabla())) {
            entradas.remove(Entrada.getNombreTabla());
            numeroDeTablas--;
        }
    }
    /**
     *
     * @param Entrada la cual queremos actualizar
     * @param i indice de un atributo de la tabla
     * @param a atributo nuevo
     */
    public void ActualizarEntrada(EntradaCatalogo Entrada,int i,Atributo a){
        if (existeTabla(Entrada.getNombreTabla())) {
            Tabla T = Entrada.getTabla();
            T.setAtributo(i, a);
        }
    }

    protected boolean existeTabla(String nombreTabla){
        return (entradas.get(nombreTabla)!=null);
    }
    @Override
    public  String toString(){
        return "Catalogo : "+numeroDeTablas+" tablas.  Entradas : \n"+"\t"+entradas.toString();
    }
    public static void main(String[] args){
        List<Atributo> atributos1 = new ArrayList<>();
        //creamos el esquema de relacion siguiente
        atributos1.add(new Atributo("id_docente", String.class));
        atributos1.add(new Atributo("nombre_docente", String.class));
        atributos1.add(new Atributo("depart_academico", String.class));
        atributos1.add(new Atributo("especialidad", String.class));
        List<Atributo> atributos2 = new ArrayList<>();
        atributos2.add(new Atributo("id_alumno", String.class));
        atributos2.add(new Atributo("nombre_alumno", String.class));
        atributos2.add(new Atributo("carrera_profesional", String.class));
        atributos2.add(new Atributo("mail_alumno", String.class));
        //creamos una tabla con todos los atributos
        Tabla tabla1 = new Tabla("Docente", atributos1);
        Tabla tabla2=new Tabla("Alumno", atributos2);
        //creamos una entrada1 y nombre de archivo
        EntradaCatalogo EC1 = new EntradaCatalogo(tabla1);
        EC1.crearNombreArchivo();
        //creamos entrada2 y nombre de archivo
        EntradaCatalogo EC2 = new EntradaCatalogo(tabla2);
        EC2.crearNombreArchivo();
        //cramos el catalogo
        Catalogo cat = new Catalogo("BaseDatosII");
        //creamos o agregar las entradas
        cat.CrearNuevaEntrada(EC1);
        cat.CrearNuevaEntrada(EC2);
        //serializamos las entradas en disco
        System.out.print("****************************************");
        System.out.print("     SERIALIZAR LAS ENTRADAS  Y MOSTRAR   ");
        System.out.println("****************************************");
        Serializador Serializar=new Serializador();
        Serializar.escribirArchivo(EC1);
        Serializar.escribirArchivo(EC2);
        System.out.println(Serializar.leerArchivo("d:/prueba/Archivo.ser"));
        System.out.println("-------------------------MOSTRAR TODO EL CATALOGO--------------------------");
        System.out.println(cat);
        //eliminar entradas
        System.out.print("****************************************");
        System.out.print("    DESPUES DE ELIMINAR LA ENTRADA      ");
        System.out.println("****************************************");
        cat.EliminarEntrada(EC2);
        System.out.println(cat);
        //actualizar entrada
        Atributo A=new Atributo("Codigo_Docente",Integer.class);//nuevo atributo
        //actualizaremos el atributo de indice 0 de la entrada1 cuyo nombre de tablas es Docente
        //id_docente por -----> Codigo_Docente y el tipo de String a Integer
        cat.ActualizarEntrada(EC1, 0, A);
        System.out.print("****************************************");
        System.out.print("    DESPUES DE ACTUALIZAR LA ENTRADA      ");
        System.out.println("****************************************");
        System.out.print(cat);
    }
}

